import { DEEP_SEEK_API_KEY, DEEP_SEEK_URL } from '@/components/chat-bot/config'
import type { IAIResponse } from './types.d'
import { handleReadProcess } from './util'

const makeFetchConfig = (query: string) => {
  const body = JSON.stringify({
    messages: [
      {
        content: '你是一个著名的医生',
        role: 'system'
      },
      {
        content: query,
        role: 'user'
      }
    ],
    model: 'deepseek-coder',
    frequency_penalty: 0,
    max_tokens: 2048,
    presence_penalty: 0,
    response_format: {
      type: 'text'
    },
    stop: null,
    stream: true,
    stream_options: null,
    temperature: 1,
    top_p: 1,
    tools: null,
    tool_choice: 'none',
    logprobs: false,
    top_logprobs: null
  })

  const config = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Accept: 'application/json',
      Authorization: `Bearer ${DEEP_SEEK_API_KEY}`
    },
    body
  }

  return config
}

// 构造腾讯大模型请求参数，其中模型类型、用户性别&年龄应由用户输入决定
const makeFetchTencentConfig = (query: string) => {
  return {
    body: JSON.stringify({
      // 用户消息文本
      message: query,
      // 用户性别
      sex: 1,
      // 用户年龄
      age: 30,
      // 大模型类型
      // 0（默认）:六分类，1.导诊，2.问药，3.问病，4.客服，5.院推荐，6.其他
      // 1:三分类，1.症状自查，2.泛健康类，3 非医疗健康类
      category: 1,
      // 是否流式返回  1流式 0非流式
      resultType: 1,
      prompt:
        '你现在是一名医生，具备丰富的医学知识和临床经验。你擅长诊断和治疗各种疾病，能为病人提供专业的医疗建议。请在这个角色下为我解答以下问题。'
    }),
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Accept: 'application/json'
    }
  }
}

// 千问
const makeFetchQianwenConfig = (query: string) => {
  return {
    body: JSON.stringify({
      model: 'gpt-3.5-turbo',
      messages: [
        {
          role: 'system',
          content:
            '你现在是一名医生，具备丰富的医学知识和临床经验。你可以根据医患之间的对话来分析出患者的病情。'
        },
        {
          role: 'user',
          content: `前提：根据以下的文案进行病情分析，如果可以分析出患者病情，生成病历记录，病历记录包含：主诉、现病史、既往史，以markdown格式返回。
          电子病历：
            主诉：[具体的症状，有无具体的持续时间]。
            现病史：患者于[有无发病时间]开始出现[具体症状]。[患者是否尝试自我处理措施,如服用药物、休息等]。
            既往史：[患者过去是否曾患有具体疾病名称,如高血压、糖尿病等，是否目前病情控制良好/一般/不稳定，是否直系亲属是否有类似疾病或其他遗传性疾病等]。
          不要多余的文本内容，注意模板格式正确，主诉字数控制精简。如果无法分析出患者的病情，则需要提示出无法分析的原因。以下是医生和患者的对话全过程：${query}。答`
        }
      ],
      stream: true
    }),
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Accept: 'application/json'
    }
  }
}

export const requestAI = async (
  query: string,
  onProcess?: (content: string) => void,
  onSuccess?: () => void,
  onError?: () => void
) => {
  try {
    // const deeSeekConfig = makeFetchConfig(query)
    // const response = await fetch(DEEP_SEEK_URL, deeSeekConfig)
    // 接入腾讯
    // const tencentConfig = makeFetchTencentConfig(query)
    // // 测试用的接口地址：https://sscholdings.feishu.cn/wiki/HMTEwbenAiENjckPJmbcG45fnYe
    // const response = await fetch(
    //   'http://10.0.70.134:31684/medical-agent/tencent/llmDialogue',
    //   // 'https://loghvarvest-hamis-test.ssc-hn.com:30999/medical-agent/tencent/llmDialogue',
    //   tencentConfig
    // )

    // 接入千问
    const qianwenConfig = makeFetchQianwenConfig(query)
    const response = await fetch('http://10.0.23.117:8080/v1/chat/completions', qianwenConfig)

    const reader = response.body!.getReader()

    // 腾讯
    // while (true) {
    //   const { done, value } = await reader.read()
    //   if (done) {
    //     break
    //   }
    //   const text = new TextDecoder().decode(value)
    //   console.log(text)

    //   const contents = handleReadProcess(text).map((parsedContent: IAIResponse) => {
    //     return parsedContent?.data?.content || ''
    //   })
    //   contents.forEach((content) => onProcess?.(content))
    // }

    // 千问
    while (true) {
      const { done, value } = await reader.read()
      if (done) {
        break
      }
      const text = new TextDecoder().decode(value)

      const contents = handleReadProcess(text).map((parsedContent: IAIResponse) => {
        return parsedContent?.choices[0]?.delta?.content || ''
      })
      contents.forEach((content) => onProcess?.(content))
    }

    onSuccess?.()
  } catch (error) {
    console.log(error)
    onError?.()
  }
}
